﻿using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using rpc_service.cache;

namespace rpc_service.core.support.assembly.il.http.get;

public abstract class ILGetHttpRequest : ILBaseStep
{
    protected void generateParam(ILGenerator il, ParameterInfo[] paramInfos, string pathUrl, LocalBuilder stringBuilderLocal)
    {
        // 初始化 StringBuilder
        il.Emit(OpCodes.Ldstr, pathUrl); // 基础 URL
        il.Emit(OpCodes.Newobj, "StringBuilder".GetTypeByStr().GetConstructor(new [] { "string".GetTypeByStr() })!);
        il.Emit(OpCodes.Stloc, stringBuilderLocal);
        
        // 如果有参数，添加查询参数分隔符 '?'
        if (paramInfos.Length > 0)
        {
            appendStringBuilder(il, stringBuilderLocal, "?");
        }

        // 遍历所有参数并添加到查询字符串中
        for (int i = 0; i < paramInfos.Length; i++)
        {
            var paramInfo = paramInfos[i];
            string paramName = paramInfo.Name!;
            
            appendStringBuilder(il, stringBuilderLocal, $"{paramName}=");
        
            // 获取参数值（假设参数值从方法参数中获取）
            // 注意：这里需要根据实际参数索引来加载参数
            // 这里假设方法的第一个参数是第一个要添加到 URL 的参数
            int parameterIndex = i + 1; // 因为 Ldarg_0 通常是 this 或第一个参数
            
            // 将参数值转换为字符串并添加
            appendStringBuilder(il, stringBuilderLocal, parameterIndex, paramInfo.ParameterType);
            
            // 如果不是最后一个参数，添加 "&" 分隔符
            if (i < paramInfos.Length - 1)
            {
                appendStringBuilder(il, stringBuilderLocal, "&");
            }
        }
    }
}